#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>

class QueueNode;
using NodePtr = QueueNode*;

class QueueNode{
public:
	int val;
	NodePtr next;
	QueueNode() : val(0), next(nullptr){ }
	QueueNode(int value) : val(value), next(nullptr){ }
};

class Queue {
public:
	Queue(NodePtr f, NodePtr r, size_t s) : front(f), rear(r), size(s) { }
	//这一步显示初始化很重要，负责指针可能为野指针或者size被随机分配一个数值
	Queue() : front(nullptr), rear(nullptr), size(0) {} 
	
	~Queue(){
		while(!isEmpty())
			deQueue();
	}
	//入队操作
	void enQueue(int);
	
	//出队操作
	void deQueue();
	
	//查看对头元素
	int frontValue();
	
	//判断队列是否为空
	bool isEmpty() const{ return size == 0; }
	
	//获取队列大小
	int getSize() const{ return size;}
	
	//获取队尾元素
	int getBackValue() const;
	
	//一次性清空队列
	void clear();
private:
	NodePtr front;
	NodePtr rear;
	size_t size;
};

#endif
